﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Data.Linq;
using System.Windows.Forms;

namespace DevEx
{
    public class CTon
    {
        private static QLVTDataContext GetDc()
        {
            QLVTDataContext dc = new QLVTDataContext();
            return dc;
        }
                
        public IQueryable<tblTon> SelectAllRecord()
        {
            QLVTDataContext dc = GetDc();

            var q = from p in dc.tblTons
                    select p;
            return q;
        }

        public tblTon SelectRecordByID(int ID_MatHang)
        {
            QLVTDataContext dc = GetDc();

            var q = (from p in dc.tblTons where p.ID_MatHang == ID_MatHang select p).SingleOrDefault();
            return q;
        }


        #region Thêm, Xóa, Sửa Tồn Đầu Kỳ
        //Insert
        public void InsertTonDauKy(tblTon obj)
        {
            QLVTDataContext dc = GetDc();

            //kiem tra sinh code
            //1. Neu chua co thi sinh code moi
            int q;
            if (obj.ID_HopDong == null)// tách ra làm 2 trường hợp, vì khi ID_HopDong = null thì Count luôn = 0 (select theo linq không đúng với kq)
                q = (from p in dc.tblTons
                     where p.ID_VatTu == obj.ID_VatTu && p.ID_CCL == obj.ID_CCL
                     && p.Gia == obj.Gia && p.ID_NguonVatTu == obj.ID_NguonVatTu && p.ID_Kho == obj.ID_Kho
                     && p.NamSX == obj.NamSX && p.ID_HopDong == null
                     select p).Count();
            else
                q = (from p in dc.tblTons
                     where p.ID_VatTu == obj.ID_VatTu && p.ID_CCL == obj.ID_CCL
                     && p.Gia == obj.Gia && p.ID_NguonVatTu == obj.ID_NguonVatTu && p.ID_Kho == obj.ID_Kho
                     && p.NamSX == obj.NamSX && p.ID_HopDong == obj.ID_HopDong
                     select p).Count();            

            if (q == 0)
            {
                var max_Code = (from p in dc.tblTons
                                where p.ID_VatTu == obj.ID_VatTu && p.ID_Kho == obj.ID_Kho 
                                select p.Code).Max();

                if (max_Code == null)
                {
                    obj.Code = 1;
                    //2. Sinh so the kho moi
                    CModule_Sy module = new CModule_Sy();
                    int ID_Kho = Convert.ToInt32(obj.ID_Kho);
                    int ID_VatTu = Convert.ToInt32(obj.ID_VatTu);
                    obj.SoTheKho = module.GetNewSoTheKho(ID_Kho, ID_VatTu);
                }
                else
                {
                    obj.Code = max_Code + 1;

                    // insert so the kho giong o tren vao voi code = 1
                    String SoTheKho = "";
                    SoTheKho = (from p in dc.tblTons
                             where p.ID_VatTu == obj.ID_VatTu && p.ID_Kho == obj.ID_Kho && p.Code == 1
                             select p.SoTheKho).SingleOrDefault();

                    //if (obj.ID_HopDong == null)// tách ra làm 2 trường hợp, vì khi ID_HopDong = null thì Count luôn = 0 (select theo linq không đúng với kq)
                        
                    //else
                    //    SoTheKho = (from p in dc.tblTons
                    //         where p.ID_VatTu == obj.ID_VatTu && p.ID_CCL == obj.ID_CCL
                    //         && p.Gia == obj.Gia && p.ID_NguonVatTu == obj.ID_NguonVatTu && p.ID_Kho == obj.ID_Kho
                    //         && p.NamSX == obj.NamSX && p.ID_HopDong == obj.ID_HopDong && p.Code == 1
                    //         select p.SoTheKho).SingleOrDefault();
                    obj.SoTheKho = SoTheKho;
                }

                obj.SLNhapKH = 0;
                obj.SLNhapTH = 0;
                obj.SLXuatKH = 0;
                obj.SLXuatTH = 0;

                dc.tblTons.InsertOnSubmit(obj);
                dc.SubmitChanges();
            }
            else if (q == 1)
            {
                //2. Neu ton tai thi hỏi kiểm tra cộng dồn SLTonKH 
                // tách ra làm 2 trường hợp, vì khi ID_HopDong = null thì ton = null (select theo linq không đúng với kq)
                tblTon ton;
                if (obj.ID_HopDong == null)
                    ton = (from p in dc.tblTons
                           where p.ID_VatTu == obj.ID_VatTu && p.ID_CCL == obj.ID_CCL
                           && p.Gia == obj.Gia && p.ID_NguonVatTu == obj.ID_NguonVatTu && p.ID_Kho == obj.ID_Kho
                           && p.NamSX == obj.NamSX && p.ID_HopDong == null
                           select p).SingleOrDefault();
                else
                    ton = (from p in dc.tblTons
                           where p.ID_VatTu == obj.ID_VatTu && p.ID_CCL == obj.ID_CCL
                           && p.Gia == obj.Gia && p.ID_NguonVatTu == obj.ID_NguonVatTu && p.ID_Kho == obj.ID_Kho
                           && p.NamSX == obj.NamSX && p.ID_HopDong == obj.ID_HopDong
                           select p).SingleOrDefault();

                ton.SLTonKH += obj.SLTonKH;
                ton.SLTonSS += obj.SLTonKH;
                ton.SLTonTH += obj.SLTonKH;
                ton.SLSS11 += obj.SLTonKH;
                MessageBox.Show("Trùng số liệu : ID_Kho = " + obj.ID_Kho.ToString() + " ID_VatTu = " + obj.ID_VatTu.ToString() );
                dc.SubmitChanges();
            }
        }

        //Delete
        public void Delete(int ID)
        {
            QLVTDataContext dc = GetDc();

            var DVT = dc.tblTons.SingleOrDefault(p => p.ID_MatHang == ID);
            dc.tblTons.DeleteOnSubmit(DVT);
            dc.SubmitChanges();
        }

        //Update
        public void Update(tblTon obj)
        {
            QLVTDataContext dc = GetDc();

            int tontai = (from p in dc.tblTons
                          where p.ID_VatTu == obj.ID_VatTu && p.ID_CCL == obj.ID_CCL
                          && p.Gia == obj.Gia && p.ID_NguonVatTu == obj.ID_NguonVatTu && p.ID_Kho == obj.ID_Kho
                          && p.NamSX == obj.NamSX
                          select p).Count();

            //Chia làm các TH Update                        
            if (tontai > 0)
            {//1. Neu update không thay đổi mặt hàng (không phát sinh mặt hàng: thay đổi số thẻ kho, vị trí trong kho, SLKH)
                dc.tblTons.Attach(obj);
                dc.Refresh(RefreshMode.KeepCurrentValues, obj);
                dc.SubmitChanges(ConflictMode.ContinueOnConflict);
            }
            else
            {   //2. Neu update tạo ra mặt hàng mới
                //2.1 Xóa mặt hàng cũ
                //2.2 Tạo mặt hàng mới
                Delete(obj.ID_MatHang);

                //obj.ID_MatHang = null;
                InsertTonDauKy(obj);
            }
        }

        #endregion

        
        public int InsertNhap(tblTon obj)
        {
            QLVTDataContext dc = GetDc();
            int ID_MatHang = 0;
            //kiem tra sinh code
            //1. Neu chua co thi sinh code moi

            int q = 0;
            if (obj.ID_HopDong == null)// tách ra làm 2 trường hợp, vì khi ID_HopDong = null thì Count luôn = 0 (select theo linq không đúng với kq)
                q = (from p in dc.tblTons
                     where p.ID_VatTu == obj.ID_VatTu && p.ID_CCL == obj.ID_CCL
                     && p.Gia == obj.Gia && p.ID_NguonVatTu == obj.ID_NguonVatTu && p.ID_Kho == obj.ID_Kho
                     && p.NamSX == obj.NamSX && p.ID_HopDong == null
                     select p).Count();
            else
                q = (from p in dc.tblTons
                 where p.ID_VatTu == obj.ID_VatTu && p.ID_CCL == obj.ID_CCL
                 && p.Gia == obj.Gia && p.ID_NguonVatTu == obj.ID_NguonVatTu && p.ID_Kho == obj.ID_Kho
                 && p.NamSX == obj.NamSX && p.ID_HopDong == obj.ID_HopDong
                 select p).Count();

            if (q == 0)
            {
                var max_Code = (from p in dc.tblTons
                                where p.ID_VatTu == obj.ID_VatTu && p.ID_Kho == obj.ID_Kho 
                                select p.Code).Max();

                if (max_Code == null)
                {
                    obj.Code = 1;
                    //2. Sinh so the kho moi
                    CModule_Sy module = new CModule_Sy();
                    int ID_Kho = Convert.ToInt32(obj.ID_Kho);
                    int ID_VatTu = Convert.ToInt32(obj.ID_VatTu);
                    obj.SoTheKho = module.GetNewSoTheKho(ID_Kho, ID_VatTu);
                }
                else
                {
                    obj.Code = max_Code + 1;
                }

                obj.SLNhapTH = 0;
                obj.SLXuatKH = 0;
                obj.SLXuatTH = 0;
                obj.SLTonSS = 0;
                obj.SLTonTH = 0;
                obj.SLSS11 = 0;

                if (obj.ID_HopDong == null)
                    obj.NguonGoc = "";
                else
                {
                    CHopDong m_hopdong = new CHopDong();
                    obj.NguonGoc = Convert.ToString(m_hopdong.SelectRecordByID(Convert.ToInt32(obj.ID_HopDong)).SoHopDong);
                }
                    

                dc.tblTons.InsertOnSubmit(obj);
                dc.SubmitChanges();
                ID_MatHang = obj.ID_MatHang;
            }
            else if (q == 1)
            {
                //2. Neu ton tai thi cộng dồn SLKH
                tblTon ton;
                // tách ra làm 2 trường hợp, vì khi ID_HopDong = null thì ton = null (select theo linq không đúng với kq)
                if (obj.ID_HopDong == null)
                    ton = (from p in dc.tblTons
                           where p.ID_VatTu == obj.ID_VatTu && p.ID_CCL == obj.ID_CCL
                           && p.Gia == obj.Gia && p.ID_NguonVatTu == obj.ID_NguonVatTu && p.ID_Kho == obj.ID_Kho
                           && p.NamSX == obj.NamSX && p.ID_HopDong == null
                           select p).SingleOrDefault();
                else
                    ton = (from p in dc.tblTons
                           where p.ID_VatTu == obj.ID_VatTu && p.ID_CCL == obj.ID_CCL
                           && p.Gia == obj.Gia && p.ID_NguonVatTu == obj.ID_NguonVatTu && p.ID_Kho == obj.ID_Kho
                           && p.NamSX == obj.NamSX && p.ID_HopDong == obj.ID_HopDong
                           select p).SingleOrDefault();

                if (ton.SLTonKH == null)
                {
                    ton.SLTonKH = obj.SLTonKH;
                }
                else
                {
                    ton.SLTonKH += obj.SLTonKH;
                }

                if (ton.SLNhapKH == null)
                {
                    ton.SLNhapKH = obj.SLTonKH;
                }
                else
                {
                    ton.SLNhapKH += obj.SLTonKH;
                }
                ton.TangKeKhoang = obj.TangKeKhoang;
                if (ton.ID_HopDong == null)
                    ton.NguonGoc = "";
                else
                {
                    CHopDong m_hopdong = new CHopDong();
                    obj.NguonGoc = Convert.ToString(m_hopdong.SelectRecordByID(Convert.ToInt32(obj.ID_HopDong)).SoHopDong);
                }
                

                dc.SubmitChanges();
                ID_MatHang = ton.ID_MatHang;
            }
            else 
            {
                MessageBox.Show("Lỗi Insert: có " + q.ToString() + " mặt hàng trong tồn");
            }
            return ID_MatHang;
        }
        
        public int UpdateNhap(tblTon obj, double SLKH)
        { 
            QLVTDataContext dc = GetDc();
            //return ID_MatHang mới sau khi update 
            int ID_MatHang = 0;
            
            //int tontai = (from p in dc.tblTons
            //              where p.ID_VatTu == obj.ID_VatTu && p.ID_CCL == obj.ID_CCL
            //              && p.Gia == obj.Gia && p.ID_NguonVatTu == obj.ID_NguonVatTu && p.ID_Kho == obj.ID_Kho
            //              && p.NamSX == obj.NamSX && p.MaKyHieu == obj.MaKyHieu && p.GiaUSD == obj.GiaUSD
            //              select p).Count();
            tblTon ton; 

                if (obj.ID_HopDong == null)
                    ton = (from p in dc.tblTons
                           where p.ID_VatTu == obj.ID_VatTu && p.ID_CCL == obj.ID_CCL
                           && p.Gia == obj.Gia && p.ID_NguonVatTu == obj.ID_NguonVatTu && p.ID_Kho == obj.ID_Kho
                           && p.NamSX == obj.NamSX && p.ID_HopDong == null
                           select p).SingleOrDefault();
                else
                    ton = (from p in dc.tblTons
                           where p.ID_VatTu == obj.ID_VatTu && p.ID_CCL == obj.ID_CCL
                           && p.Gia == obj.Gia && p.ID_NguonVatTu == obj.ID_NguonVatTu && p.ID_Kho == obj.ID_Kho
                           && p.NamSX == obj.NamSX && p.ID_HopDong == obj.ID_HopDong
                           select p).SingleOrDefault();               

            //Chia làm các TH Update                        
            if (ton == null)
            {
                DeleteNhap(obj.ID_MatHang, SLKH);
                ID_MatHang = InsertNhap(obj);
            }
            else
            {
                //if (ton.ID_MatHang == obj.ID_MatHang)
                //{//1. Neu update không thay đổi mặt hàng (không phát sinh mặt hàng: thay đổi số thẻ kho, vị trí trong kho, SLKH)
                //    dc.tblTons.Attach(obj);
                //    dc.Refresh(RefreshMode.KeepCurrentValues, obj);
                //    dc.SubmitChanges(ConflictMode.ContinueOnConflict);
                //    ID_MatHang = ton.ID_MatHang;
                //}
                //else
                //{   //2. Neu update tạo ra mặt hàng mới
                    //2.1 Xóa mặt hàng cũ
                    //2.2 Tạo mặt hàng mới
                    DeleteNhap(obj.ID_MatHang, SLKH);
                    ID_MatHang = InsertNhap(obj);
                //}
            }

            return ID_MatHang;
            
        }
                
        public void DeleteNhap(int ID_MatHang, double SLKH)
        {
            QLVTDataContext dc = GetDc();
            var ton = dc.tblTons.SingleOrDefault(p => p.ID_MatHang == ID_MatHang);

            if (SLKH > ton.SLTonKH)
            {
                MessageBox.Show("Sai sót dữ liệu. SLKH > SLTonKH");
                return;
            }
                     
            // Giảm SLTonKH = SLTonKH - SLKH            
            ton.SLTonKH = ton.SLTonKH - SLKH;
            ton.SLNhapKH = ton.SLNhapKH - SLKH;
            dc.SubmitChanges();
        }
        
        public void InsertXuat(int ID_MatHang, double SLKH)
        {
            QLVTDataContext dc = GetDc();
            var ton = dc.tblTons.SingleOrDefault(p => p.ID_MatHang == ID_MatHang);

            if (SLKH > ton.SLTonTH)
            {
                MessageBox.Show("Sai sót dữ liệu. SLKH > SLTonTH");
                return;
            }

            //Giảm SLTonKH = SLTonKH - SLKH            
            ton.SLTonKH = ton.SLTonKH - SLKH;
            ton.SLXuatKH = ton.SLXuatKH + SLKH;
            dc.SubmitChanges();
        }

        public void DeleteXuat(int ID_MatHang, double SLKH)
        {
            QLVTDataContext dc = GetDc();
            var ton = dc.tblTons.SingleOrDefault(p => p.ID_MatHang == ID_MatHang);
                      

            //Tăng SLTonKH = SLTonKH + SLKH            
            ton.SLTonKH = ton.SLTonKH + SLKH;
            ton.SLXuatKH = ton.SLXuatKH - SLKH;
            dc.SubmitChanges();
        }

        public void UpdateXuat(int ID_MatHang, double SLKH_Old, double SLKH_New)
        {
            QLVTDataContext dc = GetDc();
            var ton = dc.tblTons.SingleOrDefault(p => p.ID_MatHang == ID_MatHang);

            if (SLKH_New > ton.SLTonTH + SLKH_Old)
            {
                MessageBox.Show("Update: Sai sót dữ liệu. SLKH_New > SLTonTH + SLKH_Old");
                return;
            }

            //Giảm SLTonKH = SLTonKH + SLKH_Old - SLKH_New
            ton.SLTonKH = ton.SLTonKH + SLKH_Old - SLKH_New;
            ton.SLXuatKH = ton.SLXuatKH - SLKH_Old + SLKH_New;
            dc.SubmitChanges();

        }

        public void InsertSLTH(String NX, int ID_MatHang, double SLTH)
        {
            QLVTDataContext dc = GetDc();            
            var obj_ton = (from p in dc.tblTons
                           where p.ID_MatHang == ID_MatHang
                           select p).SingleOrDefault();

            if (NX == "N")
            {
                obj_ton.SLTonTH = obj_ton.SLTonTH + SLTH;
                obj_ton.SLNhapTH = obj_ton.SLNhapTH + SLTH;
            }
            if (NX == "X")
            {
                obj_ton.SLTonTH = obj_ton.SLTonTH - SLTH;
                obj_ton.SLXuatTH = obj_ton.SLXuatTH + SLTH;
            }

            dc.SubmitChanges(); 
        }

        public void DeleteSLTH(String NX, int ID_MatHang, double SLTH)
        {
            QLVTDataContext dc = GetDc();         
            var obj_ton = (from p in dc.tblTons
                           where p.ID_MatHang == ID_MatHang
                           select p).SingleOrDefault();

            if (NX == "N")
            {
                obj_ton.SLTonTH = obj_ton.SLTonTH - SLTH;
                obj_ton.SLNhapTH = obj_ton.SLNhapTH - SLTH;
            }
            if (NX == "X")
            {
                obj_ton.SLTonTH = obj_ton.SLTonTH + SLTH;
                obj_ton.SLXuatTH = obj_ton.SLXuatTH - SLTH;
            }

            dc.SubmitChanges(); 
        }
    }
}
